home *** CD-ROM | disk | FTP | other *** search
/ Utilities Professional 1-1500 / Utilities Professional 1-1500 (1994)(WPD)[!].iso / 12511500 / var1308.dms / var1308.adf / DNET2_10.LHA / DNet / Amiga / Sourcen.lha / lib / dnread.c < prev    next >
C/C++ Source or Header  |  1993-01-14  |  2KB  |  100 lines

  1.  
  2. /*
  3.  *  DNRead.C
  4.  */
  5.  
  6. #include "lib.h"
  7.  
  8. long
  9. DNRead(_chan, _buf, bytes)
  10. void *_chan;
  11. void *_buf;
  12. long bytes;
  13. {
  14.     CHANN *chan = (CHANN *)_chan;
  15.     char *buf = (char *)_buf;
  16.     IOSTD *ior;
  17.     int len = 0;
  18.     long n;
  19.  
  20.     if (chan->eof)
  21.     return(-1);
  22.     while (bytes && ((ior = (IOSTD *)RemHead(&chan->rdylist)) || (ior = (IOSTD *)GetMsg(&chan->port)))) {
  23. #ifdef DEBUG
  24.     printf("IOR %08lx cmd %d len %d act %d\n", ior, ior->io_Command, ior->io_Length, ior->io_Actual);
  25. #endif
  26.     if (ior->io_Message.mn_Node.ln_Type == NT_REPLYMSG) {
  27.         if (!chan->queued)
  28. #ifdef DEBUG
  29.         puts("DNRead: Software Error");
  30. #else
  31.         ;
  32. #endif
  33.         else
  34.         --chan->queued;
  35.         if (ior->io_Length)
  36.         FreeMem(ior->io_Data, ior->io_Length);
  37.         FreeMem(ior, sizeof(IOSTD));
  38.         continue;
  39.     }
  40.     switch(ior->io_Command) {
  41.     case DNCMD_CLOSE:
  42.     case DNCMD_EOF:
  43.         chan->eof = 1;
  44.         ReplyMsg((MSG *)ior);
  45.         break;
  46.     case DNCMD_IOCTL:
  47.         if (ior->io_Message.mn_Node.ln_Type == NT_REQUEUE)
  48.         AddHead(&chan->rdylist, (NODE *)ior);
  49.         else
  50.         AddTail(&chan->rdylist, (NODE *)ior);
  51.         ior->io_Message.mn_Node.ln_Type = NT_REQUEUE;
  52.         if (len == 0)
  53.         len = -2;
  54.         goto done;
  55.     case DNCMD_WRITE:
  56. #ifdef DEBUG
  57.         printf("IOR LEN/ACT %ld/%ld\n", ior->io_Length, ior->io_Actual);
  58. #endif
  59.         n = ior->io_Length - ior->io_Actual;
  60. #ifdef DEBUG
  61.         if (n < 0)
  62.         puts("len fail");
  63. #endif
  64.         if (n <= bytes) {
  65.         BMov((char *)ior->io_Data + ior->io_Actual, buf, n);
  66.         bytes -= n;
  67.         len += n;
  68.         buf += n;
  69.         ReplyMsg((MSG *)ior);
  70.         } else {
  71.         BMov((char *)ior->io_Data + ior->io_Actual, buf, bytes);
  72.         len += bytes;
  73.         ior->io_Actual += bytes;
  74.         bytes = 0;
  75.         if (ior->io_Message.mn_Node.ln_Type == NT_REQUEUE)
  76.             AddHead(&chan->rdylist, (NODE *)ior);
  77.         else
  78.             AddTail(&chan->rdylist, (NODE *)ior);
  79.         ior->io_Message.mn_Node.ln_Type = NT_REQUEUE;
  80.         }
  81.         break;
  82.     default:
  83.         ior->io_Error = 1;
  84.         ReplyMsg((MSG *)ior);
  85.     }
  86.     }
  87. #ifdef DEBUG
  88.     puts("DONE1");
  89. #endif
  90. done:
  91.     FixSignal(chan);
  92.     if (chan->eof)
  93.     SetSignal(1 << chan->port.mp_SigBit, 1 << chan->port.mp_SigBit);
  94. #ifdef DEBUG
  95.     printf("RETURN %ld\n", len);
  96. #endif
  97.     return(len);
  98. }
  99.  
  100.